/**
 * @brief 边集数组, e[i] 存储第 i 条边的 {起点 u, 终点 v, 边权 w}
 * 时间复杂度：O(nm)，空间复杂度 O(m)
 * 存储的数据结构: 结构体数组
 * 应用场景：在 kruskal 算法中，需要将边按权进行排序
 */
#include <iostream>
using namespace std;
const int MAX = 10003;
struct Edge {
  int u, v, w;
} e[MAX];
// vis 用来判断是否走过
bool vis[MAX];
// n: 点数，m: 边数
int n, m;

void dfs(int u) {
  vis[u] = true;

  for (int i = 1; i <= m; ++i) {
    if (e[i].u == u) {
      cout << e[i].u << ", " << e[i].v << ", " << e[i].w << endl;
      if (vis[e[i].v])
        continue;
      dfs(e[i].v);
    }
  }
}

int main() {
  int u, v, w;
  cin >> n >> m;
  for (int i = 1; i <= m; ++i) {
    cin >> u >> v >> w;
    e[i] = {u, v, w};
  }

  dfs(1);
  return 0;
}